
// 对象demo使用带参数的构造函数创建，首先会调用默认构造函数（将Name设置为 "Jerry"），
// 然后将 Name 设置为 "Spike"。
// 对象初始化列表中的 Name = "Butch" 将覆盖之前的值，将 Name 最终设置为 "Butch"。
var demo = new Demo(name: "Spike") { Name = "Butch" };
// 最终结果：demo.Name = "Butch"
public class Demo
{
    //这个是最早的
    public string Name { get; set; } = "Tom"; // 默认值为 "Tom"
    public Demo()
    {
        Name = "Jerry"; // 默认构造函数，将 Name 设置为 "Jerry"
    }
    // 派生类会自动调用直接基类的无参构造函数（相当于隐式添加: base()）
    // 如果基类没有无参构造函数，必须显式指定调用哪个基类构造函数
    // 有参构造函数不会自动调用无参构造函数，除非你显式使用this()来调用
    public Demo(string name) : this()
    {
        Name = name; // 带参数的构造函数，将 Name 设置为传入的值
    }
}
public class Student
{
    // init只能在初始化时赋值(直接赋值，构造函数，对象初始化器)，之后就变成只读的了
    public string Name { get; init; }
    public int Age { get; init; }
}

class Program
{
    static void Main(string[] args)
    {
        // 对象初始化器用来初始化属性，而不是字段，不依赖于构造函数
        var student = new Student
        {
            Name = "Bob",  // ✅ 允许
            Age = 20       // ✅ 允许
        };
    }
}
